package multiplex.dataaccess.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import multiplex.dataaccess.DaoException;
import multiplex.model.Cadeira;
import multiplex.model.CompraMarcada;
import multiplex.model.Sessao;

public class CompraMarcadaDao extends AbstractDao implements ICompraDao<CompraMarcada>{
	
	public CompraMarcada get(int id) throws DaoException{
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Compra WHERE id =?");
			st.setInt(1, id);		
			ResultSet rs = st.executeQuery();
			if(rs.next()){
				CompraMarcada compraMarcada = new CompraMarcada(); 
				fillCompra(compraMarcada, rs);
				st.close();
				return compraMarcada;
			}
		} catch(Exception e){
			throw new DaoException(e);
		}
		return null;
	}
	public List<CompraMarcada> getAll() throws DaoException{
		List<CompraMarcada> comprasMarcadas = new ArrayList<CompraMarcada>();
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Compra");
			ResultSet rs = st.executeQuery();
			if(rs.next()){
				CompraMarcada compraMarcada = new CompraMarcada(); 
				fillCompra(compraMarcada, rs);
				comprasMarcadas.add(compraMarcada);
			}
			st.close();
		} catch(Exception e){
			throw new DaoException(e);
		}
		return comprasMarcadas;
	}
	public List<CompraMarcada> getAllFromSessao(Sessao sessao) throws DaoException{
		List<CompraMarcada> comprasMarcadas = new ArrayList<CompraMarcada>();
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Compra WHERE Sessao_id=?");
			st.setInt(1,sessao.getId());
			ResultSet rs = st.executeQuery();
			if(rs.next()){
				CompraMarcada compraMarcada = new CompraMarcada(); 
				fillCompra(compraMarcada, rs);
				comprasMarcadas.add(compraMarcada);
			}
			st.close();
		} catch(Exception e){
			throw new DaoException(e);
		}
		return comprasMarcadas;
	}
	public void save(CompraMarcada compraMarcada) throws DaoException{
		try{
			CadeiraDao cadeiraDAO = new CadeiraDao();
			PreparedStatement st = getConnection().prepareStatement(
					"INSERT INTO Compra (preco, Sessao_id, Usuario_id, numCartao)" +
					"VALUES (?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
			fillPreparedStatement(st, compraMarcada);
			st.execute();
			ResultSet rs = st.getGeneratedKeys();
			rs.next();
			compraMarcada.setId(rs.getInt(1));
			st.close();
			for (Cadeira cadeira : compraMarcada.getCadeirasCompradas()) {
				cadeiraDAO.save(cadeira,compraMarcada.getId());
			}
			}catch(Throwable e){
			throw new DaoException(e);
		}
	}


	private void fillCompra(CompraMarcada compraMarcada, ResultSet rs) throws SQLException{
		SessaoDao sessaoDAO = new SessaoDao();
		UsuarioDao usuarioaDAO = new UsuarioDao();
		CadeiraDao cadeiraDAO = new CadeiraDao();
		
		compraMarcada.setId(rs.getInt("id"));
		compraMarcada.setNumCartaoCredito(rs.getString("numCartao"));
		compraMarcada.setPreco(rs.getDouble("preco"));
		
		compraMarcada.setSessao(sessaoDAO.get(rs.getInt("Sessao_id")));
		compraMarcada.setUsuario(usuarioaDAO.get(rs.getInt("Usuario_id")));
		compraMarcada.setCadeirasCompradas(cadeiraDAO.getAllFromCompraMarcada(compraMarcada));
	}
	
	private void fillPreparedStatement(PreparedStatement st, CompraMarcada compraMarcada) throws SQLException{
			st.setDouble(1,compraMarcada.getPreco());
			st.setInt(2,compraMarcada.getSessao().getId());
			st.setInt(3,compraMarcada.getUsuario().getId());
			st.setString(4,compraMarcada.getNumCartaoCredito());
	}
}
